package lambda06;

import org.junit.Test;

import java.util.function.Function;

/**
 * Function接口
 *    //为了完成链式编程,会将最后一个Function接口对应的Lambda的执行结果传递给倒数第二个Lambda表达式的参数,以此类推
 *     default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
 *         Objects.requireNonNull(before);
 *         return (V v) -> this.apply(before.apply(v)); //f1.apply(f2.apply(13))
 *     }
 *
 *     //为了完成链式编程,会将第一个Function接口对应的Lambda的执行结果传递给第二个Lambda表达式的参数,以此类推
 *      default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
 *         Objects.requireNonNull(after);
 *         return (T t) -> after.apply(this.apply(t));//相当于f2.apply(f1.apply(t))
 *   }
 */
/*
* * 需求:将一个字符串的首字母转换成大写返回
 *     首先截取出字符串的首字母
 *     再将该首字母转换成大写
 */
public class FunctionDemo02 {
    @Test
    public void test01(){
        String w = method("wang", str -> str.substring(0, 1), str -> str.toUpperCase());
        System.out.println(w); // W
    }

    public String method(String str, Function<String,String> f1,Function<String,String> f2){
        /*String s1 = f1.apply(str);
        String s2 = f2.apply(s1);*/

        return f1.andThen(f2).apply(str) ;
    }

    @Test
    public void test02() {
        Function<Integer,Integer> f1 = i -> i+2;
        Function<Integer,Integer> f2 = j -> j*3;
        System.out.println(f1.andThen(f2).apply(13));
                                    // f2.apply(f1.apply(13))  45

        System.out.println(f1.compose(f2).apply(13));
                                    // f1.apply(f2.apply(13))  41
    }
}

